<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
use Carbon\Carbon;

class CheckMemberPermission
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        // 检查是否启用会员权限检查
        if (!Config::get('app.member_permission_check', true)) {
            // 如果未启用，直接通过
            return $next($request);
        }

        // 检查用户是否已登录
        if (!auth('wechat')->check()) {
            // 根据请求类型返回不同的响应
            if ($request->expectsJson()) {
                return response()->json([
                    'code' => 401,
                    'message' => '请先登录',
                    'data' => []
                ], 401);
            }
            return redirect()->route('wechat.service.account.login');
        }

        // 获取当前用户ID
        $userId = auth('wechat')->id();

        // 检查用户是否有有效的会员权益
        $hasValidMembership = \App\Models\RedemptionCode::where('used_user_id', $userId)
            ->where('type', 'time_access')
            ->where('status', 'used')
            ->where(function ($query) {
                // 检查expired_at是否大于当前时间，或者是否为null（不过期）
                $query->where(function ($subQuery) {
                    $subQuery->where('expired_at', '>', Carbon::now())
                             ->orWhereNull('expired_at');
                });
            })
            ->exists();

        // 如果没有有效的会员权益
        if (!$hasValidMembership) {
            // 根据请求类型返回不同的响应
            if ($request->expectsJson()) {
                return response()->json([
                    'code' => 403,
                    'message' => '您需要有效的会员权益才能访问商品',
                    'data' => []
                ], 403);
            }
            
            // 对于页面请求，重定向到会员权益页面
            return redirect()->route('wechat.service.account.wallet')
                ->with('error', '您需要有效的会员权益才能访问商品，请先兑换会员权益');
        }

        // 如果有权限，继续请求
        return $next($request);
    }
}